DAY15的最後提到了launch文件中的節點設定,有兩個中文都是『參數』的參數(繞口令XD),分別是parameters與arguments,在xml格式是<param>
與<arg>
,我自己依然在努力搞懂它們的差異...那我第一次同時發現它們的存在,是因為在使用兩個不同的人寫的package,同樣都是開啟robot_state_publisher
節點,但用法卻不太一樣?
# AMR_DAY15(我自己的package)
start_rviz_cmd = Node(
#...
# arguments=[-d,""]
)
pcl_node = Node(
# ...
parameters=[
{'KS': 50},
{'RS':0.1},
{'AT':1.2}
]
)
# 當初發現兩個不同的package,使用robot_state_publisher的方式不太一樣
# robot_state_publisher未來天數會提到
package_1_robot_publisher = Node(
package='robot_state_publisher',
executable='robot_state_publisher',
arguments=[robot.urdf]
)
package_2_robot_publisher = Node(
package='robot_state_publisher',
executable='robot_state_publisher',
parameters=[{'robot_description': 『robot.urdf的內容』}]
)
我自己最後得到的結論是parameters是『ROS2中的參數服務系統』,arguments只是『launch文件中的其中一組參數』,更具體的介紹arguments應該是給c++的主程式main(int argc, char **argv)
使用的參數。在python應該就是sys.argv[]
?我和python沒那麼熟...
p.s.如果有錯誤理解的話請糾正我!
接下來,今天來看看『ROS2中的參數服務系統』教學吧~~
剛提到在ROS2中parameters是相當重要的一環,也就是參數服務系統,可以預設節點參數,免去掉每次修改完cpp的中一個變數,就要重新colcon build
的時間。
舉我自己的例子,pcl_node中會用到歐幾里得距離分群,簡單來說需要設定一個距離變數D
,在這範圍內(<D
)的點都算同一群,那我不想每次為了只修改這個距離D
就要重新編譯整個package,我就可以把D
設為para,然後在terminal時下指令
ros2 run <package_name> <node_name> --ros-args -p D:=5
那這樣就是用參數服務系統作修改預設參數這件事了
cpp的寫法未來天數會提到,今天專注在基本的parameters命令~~
繼續用turtlesim
做範例
先啟動兩個不同的terminal,並且分別ros2 run
# terminal1 小烏龜節點
ros2 run turtlesim turtlesim_node
# terminal2 鍵盤控制節點
ros2 run turtlesim turtle_teleop_key
再開一個新的terminal 來列出所有parameters
ros2 param list #列出所有可以使用的參數
ros2 param get <node_name> <parameter_name> #取得參數的值
ros2 param get /turtlesim background_g
ros2 param set <node_name> <parameter_name> <value> #設定參數的值
ros2 param set /turtlesim background_r 255
ros2 param dump <node_name> #列出該節點的所有參數與值,並存為yaml檔
ros2 param dump /turtlesim
Saving to: ./turtlesim.yaml
# ./turtlesim.yaml
/turtlesim:
ros__parameters:
background_b: 255
background_g: 86
background_r: 255
use_sim_time: false
p.s.這是ROS2 parameters參數檔個固定格式!!
/<node_name>:
ros__parameters:
# parameter1: 0
修改turtlesim.yaml並存檔
/turtlesim:
ros__parameters:
background_b: 10
background_g: 255
background_r: 10
use_sim_time: false
ros2 param load <node_name> <parameter_file> #修改yaml檔,並重新載入給節點
ros2 param load /turtlesim turtlesim.yaml
ros2 run <package_name> <executable_name> --ros-args --params-file <file_name> #在啟動節點時,直接帶入參數檔
ros2 run turtlesim turtlesim_node --ros-args --params-file turtlesim.yaml